梦想不会自己发光,真正闪耀的是那个为梦狂奔的你。献给知行的孩子们!(Eric.He著)
本教程将从机器数与真值的基础概念出发,全面讲解数的原码、补码、反码表示方法,以及定点表示和浮点表示的核心原理,帮助你掌握计算机底层数值存储的核心逻辑。
计算机中,机器数是指将数字的符号(正/负)和数值部分一起编码后,存储在计算机中的二进制数。其核心特性:
-128 ~ 127);示例:8位机器数表示十进制数+5和-5
符号位(最高位)+ 数值位(后7位):
+5 的机器数(原码):0000 0101
-5 的机器数(原码):1000 0101
真值是指数字本身的实际值,即带符号的十进制数(或其他进制数),是人类可直接理解的数值形式,未经过计算机编码处理。
示例:常见真值与机器数的对应
| 真值 | 8位机器数(原码) | 8位机器数(补码) |
|---|---|---|
| +10 | 0000 1010 | 0000 1010 |
| -10 | 1000 1010 | 1111 0110 |
| +0 | 0000 0000 | 0000 0000 |
| -0 | 1000 0000 | 0000 0000(补码中0唯一) |
机器数是真值在计算机中的编码形式,二者是“存储形式”与“实际值”的关系:
注意:计算机底层不直接存储真值,所有数值运算都是基于机器数(补码)完成的,运算结果再解码为真值供人类读取。
原码是最简单的机器数编码方式,直接将真值的符号和数值部分转换为二进制:
-(2^(n-1)-1) ~ +(2^(n-1)-1)(如8位:-127 ~ +127)。
// 正数原码:符号位0 + 数值位
真值 +7 → 原码:0000 0111
真值 +127 → 原码:0111 1111
// 负数原码:符号位1 + 数值位(绝对值)
真值 -7 → 原码:1000 0111
真值 -127 → 原码:1111 1111
// 0的原码(有两种表示)
真值 +0 → 原码:0000 0000
真值 -0 → 原码:1000 0000
反码是原码到补码的过渡编码,解决了原码加减法的部分问题:
-(2^(n-1)-1) ~ +(2^(n-1)-1)(如8位:-127 ~ +127)。
// 正数反码(与原码一致)
真值 +7 → 原码:0000 0111 → 反码:0000 0111
真值 +127 → 原码:0111 1111 → 反码:0111 1111
// 负数反码(数值位取反)
真值 -7 → 原码:1000 0111 → 反码:1111 1000
真值 -127 → 原码:1111 1111 → 反码:1000 0000
// 0的反码(有两种表示)
真值 +0 → 反码:0000 0000
真值 -0 → 反码:1111 1111
补码是计算机实际存储和运算的编码方式,彻底解决了原码/反码的缺陷:
-2^(n-1) ~ +(2^(n-1)-1)(如8位:-128 ~ +127);0000 0000(-0的补码与+0一致)。
// 正数补码(与原码/反码一致)
真值 +7 → 原码:0000 0111 → 反码:0000 0111 → 补码:0000 0111
真值 +127 → 原码:0111 1111 → 反码:0111 1111 → 补码:0111 1111
// 负数补码(反码+1)
真值 -7 → 原码:1000 0111 → 反码:1111 1000 → 补码:1111 1001
真值 -128 → 补码:1000 0000(8位补码特殊值,无原码/反码对应)
// 0的补码(唯一)
真值 +0/-0 → 补码:0000 0000
a - b = a + (-b)的补码,无需判断符号;示例:补码实现减法(7 - 5 = 2)
// 转换为补码加法:7 + (-5)
+7 的补码:0000 0111
-5 的补码:1111 1011
// 补码相加(忽略最高位进位)
0000 0111
+ 1111 1011
=1 0000 0010 → 舍弃进位 → 0000 0010(补码)
// 补码转真值:0000 0010 → +2(结果正确)
| 转换方向 | 转换规则 | 8位示例(以-7为例) |
|---|---|---|
| 真值 → 原码 | 符号位+数值位(绝对值) | -7 → 1000 0111 |
| 原码 → 反码 | 正数:不变;负数:符号位不变,数值位取反 | 1000 0111 → 1111 1000 |
| 反码 → 补码 | 正数:不变;负数:反码+1 | 1111 1000 → 1111 1001 |
| 补码 → 原码 | 正数:不变;负数:补码-1后数值位取反,符号位不变 | 1111 1001 → 1000 0111 |
核心口诀:正数三码合一;负数反码取反、补码取反加一;补码转原码,负数先减一再取反(或直接取反加一,结果一致)。
定点表示是指在机器数中,小数点的位置固定不变的数值表示方法,分为定点整数和定点小数:
浮点表示是指小数点位置可浮动的数值表示方法,借鉴科学计数法,分为符号位、阶码、尾数三部分:
// 32位单精度浮点数(float)
1位符号位(S) + 8位阶码(E) + 23位尾数(M)
// 64位双精度浮点数(double)
1位符号位(S) + 11位阶码(E) + 52位尾数(M)
// 数值计算公式
N = (-1)^S × (1.M) × 2^(E-偏移量)
// 单精度偏移量:127;双精度偏移量:1023
// 步骤1:将0.5转换为二进制科学计数法
0.5 = 1.0 × 2^(-1)
// 步骤2:拆分各部分
符号位(S):0(正数)
阶码(E):-1 + 127 = 126 → 二进制:0111 1110
尾数(M):0(1.0的小数部分为0)
// 最终32位浮点数
0 01111110 00000000000000000000000
| 对比维度 | 定点表示 | 浮点表示 |
|---|---|---|
| 小数点位置 | 固定(隐含) | 浮动(由阶码决定) |
| 表示范围 | 小(受字长限制) | 大(阶码扩展范围) |
| 精度 | 固定,易浪费 | 可变,精度更高 |
| 运算复杂度 | 简单(仅加减乘除) | 复杂(需处理阶码、尾数) |
| 硬件实现 | 简单,成本低 | 复杂,成本高 |
| 适用场景 | 嵌入式系统、简单计算 | 通用计算机、科学计算、大数据处理 |
本教程从机器数与真值的基础出发,系统讲解了原码、补码、反码的编码规则和转换方法,以及定点/浮点表示的核心原理。掌握这些知识,是理解计算机底层数值处理的关键,也是学习计算机组成原理、操作系统、编译器的重要基础。